package tp3;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.File;

public class Cliente {

    /* Maximo de pedidos enviados durante os testes */
    private static final int MAX_PEDIDOS = 105;
    
    private Cliente() {}

    public static void imprimeFilme(Filme f){
        System.out.println("\nInformacoes do filme numero "+f.getId()+": \n");
        System.out.println("Titulo: " + f.getTitulo());
        System.out.println("Horarios: " + f.getHorario());
        System.out.println("Sala: " + f.getSala());
        System.out.println("Sinopse: " + f.getSinopse());
        System.out.println("Nota media do filme " + f.getId() + ": " + f.getNota());
        System.out.println("Numero de clientes que deram a nota: " + f.getNumClientes());
        System.out.println("-----------------------------------------------");
    }
    public static void imprimeMenu(){
        System.out.println("\nEscolha uma das opcoes abaixo: \n");
        System.out.println("  1. Listar todos os numeros de filmes com seus titulos");
        System.out.println("  2. Mostrar sinopse de um filme");
        System.out.println("  3. Mostrar todas as informacoes de um filme");
        System.out.println("  4. Listar todas as informacoes de todos os filmes");
        System.out.println("  5. Dar nota para um filme");
        System.out.println("  6. Mostrar a nota e o numero de clientes de um filme");
        System.out.println("  0. Sair");
        System.out.print("\n  Opcao: ");
    }

    public static void main(String[] args) {
        /* Instala SecurityManager */
        /*if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }*/

	try {
            
            /* Le de outro arquivo de entrada para automatizar testes */
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("arq1")));
            Scanner scan = new Scanner(br).useDelimiter("\n");

            /* Le o ip do servidor */
            System.out.print("IP do servidor: ");
            String host = scan.next();

            /* Encontra registro e pega o stub */
	    Registry registry = LocateRegistry.getRegistry(host, 1099);
            IServidorCinema stub = (IServidorCinema) registry.lookup("ServidorFilmes");

            /* Variaveis para medicao de tempo */
            long tempo;
            int numPedidos = 0;
            float[] tempos = new float[Cliente.MAX_PEDIDOS];

            //System.out.print("Id do cliente: ");
            byte idCliente = 0;
            File fsaida = new File("tempos_cliente"+idCliente+".csv");
            while(fsaida.exists()){
                idCliente++;
                fsaida = new File("tempos_cliente"+idCliente+".csv");
            }
            fsaida = null;
            
            System.out.println("Bem vindo ao sistema de informacoes de filmes!");
            Cliente.imprimeMenu();
            
            int opcao = scan.nextInt();

            while(opcao!=0){
                /* Chama o metodo do stub de acordo com a opcao */
                if(opcao==1){
                    tempo = -System.nanoTime();
                    String[] titulos = stub.recuperarTitulos(idCliente);
                    tempo += System.nanoTime();
                    tempos[numPedidos++] = ((float)tempo)/1000000000;
                    for(int i = 0; i < titulos.length; i++){
                        System.out.println(i + "- " + titulos[i]);
                    }
                }else if(opcao==2){
                    System.out.print("Numero do filme: ");
                    int id = scan.nextInt();
                    tempo = -System.nanoTime();
                    String sinopse = stub.recuperarSinopseFilme(id, idCliente);
                    tempo += System.nanoTime();
                    tempos[numPedidos++] = ((float)tempo)/1000000000;
                    System.out.println(sinopse);
                }else if(opcao==3){
                    System.out.print("Numero do filme: ");
                    int id = scan.nextInt();
                    tempo = -System.nanoTime();
                    Filme filme = stub.recuperarInformacoesFilme(id, idCliente);
                    tempo += System.nanoTime();
                    tempos[numPedidos++] = ((float)tempo)/1000000000;
                    Cliente.imprimeFilme(filme);
                }else if(opcao==4){
                    tempo = -System.nanoTime();
                    Filme[] f = stub.recuperarTudo(idCliente);
                    tempo += System.nanoTime();
                    tempos[numPedidos++] = ((float)tempo)/1000000000;
                    for(int i = 0; i < f.length; i++){
                        Cliente.imprimeFilme(f[i]);
                    }
                }else if(opcao==5){
                    System.out.print("Numero do filme: ");
                    int id = scan.nextInt();

                    int nota;
                    do{
                        System.out.print("Nota (0-100): ");
                        nota = scan.nextInt();
                    }while(nota < 0 || nota > 100);
                    tempo = -System.nanoTime();
                    int novaNota = stub.darNotaFilme(id, nota, idCliente);
                    tempo += System.nanoTime();
                    tempos[numPedidos++] = ((float)tempo)/1000000000;
                    System.out.println("Nova nota media do filme " + id + ":" + novaNota);
                }else if(opcao==6){
                    System.out.print("Numero do filme: ");
                    int id = scan.nextInt();
                    tempo = -System.nanoTime();
                    Pair<Integer, Integer> p = stub.recuperarNotaFilme(id, idCliente);
                    tempo += System.nanoTime();
                    tempos[numPedidos++] = ((float)tempo)/1000000000;

                    System.out.println("\nNota media do filme " + id + ": " + p.getFirst());
                    System.out.println("Numero de clientes que deram a nota: " + p.getSecond());
                }
                /* Le proxima opcao */
                Cliente.imprimeMenu();
                opcao = scan.nextInt();
            }
            scan.close();

            /* Grava tempos nos arquivos */
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("tempos_cliente"+idCliente+".csv")));
            for(int i=0; i<numPedidos; i++){
                bw.write(tempos[i]+";\n");
            }
            bw.close();
            return;
	} catch (Exception e) {
	    System.err.println("Excecao no cliente: " + e.toString());
	    e.printStackTrace();
	}
    }
}
